package com.oschina.bottle.coder;


import com.oschina.bottle.coder.asymmetric.RSA;
import com.oschina.bottle.coder.digest.MD5;
import com.oschina.bottle.coder.digest.SHA;
import com.oschina.bottle.coder.digest.SHA256;
import com.oschina.bottle.coder.digest.SHA384;
import com.oschina.bottle.coder.digest.SHA512;
import com.oschina.bottle.coder.symmetric.AES;
import com.oschina.bottle.coder.symmetric.DES;
import com.oschina.bottle.coder.symmetric.DESede;

/**
 * 加解密算法工具，使用该类调用加解密方法
 *
 * @author <a href="mailto:zhongchao@gegejia.com">zhong</a>
 * @version 1.0 2016/11/11
 * @since 1.0
 */
public class CoderUtils
{

    /**
     * MD5摘要算法，返回32位小写字符串
     *
     * 16位结果，自行截取（8 - 24位）
     *
     * @param data
     * @return
     */
    public static String md5(String data) {
        return new MD5().encrypt(data);
    }

    /**
     * sha摘要算法
     *
     * @param data
     * @return
     */
    public static String sha(String data) {
        return new SHA().encrypt(data);
    }

    /**
     * sha256 摘要算法
     *
     * @param data
     * @return
     */
    public static String sha256(String data) {
        return new SHA256().encrypt(data);
    }

    /**
     * sha384 摘要算法
     *
     * @param data
     * @return
     */
    public static String sha384(String data) {
        return new SHA384().encrypt(data);
    }

    /**
     * sha512 摘要算法
     *
     * @param data
     * @return
     */
    public static String sha512(String data) {
        return new SHA512().encrypt(data);
    }

    /**
     * AES对称算法加密
     *
     * new AES(key).encrypt(data)
     * new AES(key).decrypt(data)
     *
     * @param key
     * @return
     */
    public static AES aes(String key) {
        return new AES(key);
    }

    /**
     * DES对称算法加密
     *
     * new DES(key).encrypt(data)
     * new DES(key).decrypt(data)
     *
     * @param key
     * @return
     */
    public static DES des(String key) {
        return new DES(key);
    }

    /**
     * DESede对称算法加密
     *
     * new DES(key).encrypt(data)
     * new DES(key).decrypt(data)
     *
     * @param key
     * @return
     */
    public static DESede desede(String key) {
        return new DESede(key);
    }


    /**
     * RSA非对称签名算法
     *
     * 一对密钥：公钥、私钥。使用方法：
     * ++++ 公钥加密: encrypt(String data, KeyType.PUBLIC)、私钥解密: encrypt(String data, KeyType.PRIVATE)
     * ++++ 私钥加密: encrypt(String data, KeyType.PRIVATE)、公钥解密: encrypt(String data, KeyType.PUBLIC)
     * ++++ 私钥签名: sign(String data)、公钥校验: verify(String data, String sign)
     *
     *
     * @param privateKey
     * @param publicKey
     * @return
     */
    public static RSA rsa(String privateKey, String publicKey) {
        return new RSA(privateKey, publicKey);
    }
}
